package io.github.echarts.render.svg;

import java.awt.geom.Path2D;
import java.awt.geom.PathIterator;
import java.util.Locale;

/**
 * Path处理工具类，用于将Java的Path2D转换为SVG路径数据字符串
 */
public class PathUtil {
    
    /**
     * 将Path2D转换为SVG路径数据，执行Y坐标转换
     *
     * @param path Path2D对象
     * @param height SVG画布高度（用于Y轴翻转）
     * @return SVG路径数据字符串
     */
    public static String convertToSVGPath(Path2D path, int height) {
        if (path == null) {
            return "";
        }
        
        StringBuilder pathData = new StringBuilder();
        float[] coords = new float[6];
        
        try {
            // 使用PathIterator遍历路径中的所有点和命令
            PathIterator pathIterator = path.getPathIterator(null);
            
            while (!pathIterator.isDone()) {
                int type = pathIterator.currentSegment(coords);
                
                // 对所有Y坐标进行转换（从左下角原点转换为SVG的左上角原点）
                transformYCoordinates(coords, height, type);
                
                switch (type) {
                    case PathIterator.SEG_MOVETO:
                        pathData.append("M").append(formatCoord(coords[0])).append(",")
                               .append(formatCoord(coords[1])).append(" ");
                        break;
                    case PathIterator.SEG_LINETO:
                        pathData.append("L").append(formatCoord(coords[0])).append(",")
                               .append(formatCoord(coords[1])).append(" ");
                        break;
                    case PathIterator.SEG_QUADTO:
                        pathData.append("Q").append(formatCoord(coords[0])).append(",")
                               .append(formatCoord(coords[1])).append(" ")
                               .append(formatCoord(coords[2])).append(",")
                               .append(formatCoord(coords[3])).append(" ");
                        break;
                    case PathIterator.SEG_CUBICTO:
                        pathData.append("C").append(formatCoord(coords[0])).append(",")
                               .append(formatCoord(coords[1])).append(" ")
                               .append(formatCoord(coords[2])).append(",")
                               .append(formatCoord(coords[3])).append(" ")
                               .append(formatCoord(coords[4])).append(",")
                               .append(formatCoord(coords[5])).append(" ");
                        break;
                    case PathIterator.SEG_CLOSE:
                        pathData.append("Z ");
                        break;
                }
                
                pathIterator.next();
            }
        } catch (Exception e) {
            return ""; // 发生异常时返回空路径
        }
        
        return pathData.toString().trim();
    }
    
    /**
     * 对坐标数组中的Y坐标进行转换
     *
     * @param coords 坐标数组
     * @param height SVG画布高度
     * @param segmentType 路径段类型
     */
    private static void transformYCoordinates(float[] coords, int height, int segmentType) {
        switch (segmentType) {
            case PathIterator.SEG_MOVETO:
            case PathIterator.SEG_LINETO:
                // Y坐标是奇数索引
                coords[1] = height - coords[1];
                break;
            case PathIterator.SEG_QUADTO:
                // Y坐标在1和3
                coords[1] = height - coords[1];
                coords[3] = height - coords[3];
                break;
            case PathIterator.SEG_CUBICTO:
                // Y坐标在1, 3, 5
                coords[1] = height - coords[1];
                coords[3] = height - coords[3];
                coords[5] = height - coords[5];
                break;
        }
    }
    
    /**
     * 格式化坐标值为字符串，避免科学记数法，保留一定精度
     *
     * @param value 坐标值
     * @return 格式化后的坐标字符串
     */
    private static String formatCoord(float value) {
        // 保留一位小数，避免科学记数法
        return String.format(Locale.US, "%.1f", value);
    }
} 